#ifndef GRAPH_H
#define GRAPH_H

#include <vector>
#include <map>
#include <list>

using namespace std;

class graph {

    int V;
    int E;
	vector<map<int,int> > *adj_vector;
	int	**adj_matrix;

	list<map<int,int> > *adj_list;
	
public:
	graph();

	int getV();
	int	getE();
	void t_start();
	void t_stop();
	unsigned long long t_ms;

    void load_vector(const char* filename);
	void print_vector();

	void load_list(const char* filename);
	void print_list();

	void load_matrix(const char* filename);
	void print_matrix();

	int bellman_ford(int start, int meta);
	int bellman_ford_matrix(int start, int meta);
	int bellman_ford_list(int start, int meta);

    int dijkstra(int start, int meta);
	int dijkstra_matrix(int start, int meta);
	int dijkstra_list(int start, int meta);

	int mst_kruskal();
	int mst_kruskal_matrix();
	int mst_prim(int start);
	int mst_prim_matrix(int start);

    void queue_tests();
	void t_test();
};

#endif
